#ifndef __OPENGL_APPLICATION_HH__
#define __OPENGL_APPLICATION_HH__

#include <opengl/texture.h>
#include <opengl/shader.h>
#include <opengl/window.h>
#include <map>
#include <string>
#include <list>

namespace opengl
{

//! @brief opengl 应用程序类，包含一些 opengl 对象
class Application
{
public:
    //! @brief 单例模式
    static Application* instance();
    static void free();

private:
    //! @brief 单例对象
    static Application* _instance;

    //! @brief 默认构造与析构
    Application();
    ~Application() noexcept;

public:
    //! @brief 切换当前窗口
    //! @param window 
    void switchWindow(opengl::Window* window)
    { this->_currentWindow = window; }

    //! @brief 激活纹理对象
    void activeTextures();

private:
    //! @brief 窗口对象链表
    std::list<opengl::Window*> _windows;

    //! @brief 纹理字典
    std::map<std::string, Texture*> _textures;

    //! @brief 着色器字典
    std::map<std::string, opengl::Shader*> _shaders;

    //! @brief 当前窗口对象
    opengl::Window* _currentWindow;

public:
    std::map<std::string, Texture*>& textures()
    { return this->_textures; }

    std::map<std::string, opengl::Shader*>& shaders()
    { return this->_shaders; }
    
    std::list<opengl::Window*>& windows()
    { return this->_windows; }

    opengl::Window* currentWindow()
    { return this->_currentWindow; }
};

}

#endif